#include "world.h"
#include <iostream>
using namespace std;

IMAGE tr;//地图元素
IMAGE tr2;
IMAGE it1;//物品
IMAGE it2;
IMAGE M; //怪物
IMAGE M2;
IMAGE p1;//玩家，游戏角色，朝向顺序：w a s d 
IMAGE p2;
IMAGE p3;
IMAGE p4;

//从这一侧看地图---->
enu world[MAP_SIZE][MAP_SIZE] = {
    { enu(1, tr), enu(1, tr), enu(1, tr), enu(1, tr) },
    { enu(0, tr2), enu(0, it1), enu(0, tr2), enu(1, tr) },
    { enu(0, tr2), enu(0, tr2), enu(0, it2), enu(1, tr) },
    { enu(0, M2),  enu(0, M), enu(1, tr), enu(1, tr) }
};
//这里设计两个world纯属前期设计失误，但我懒得改了,这一个world用来存储物品属性
elem world_[MAP_SIZE][MAP_SIZE] =
{
    {elem(0),elem(0),elem(0),elem(0)},
    {elem(1),elem(0),elem(0),elem(0)},
    {elem(0),elem(0),elem(0),elem(0)},
    {elem(12),elem(11),elem(0),elem(0)}
};

void init_world()
{
    initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
    setbkcolor(WHITE);

    /*load 区*/
    loadimage(&tr, _T("graph/1.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&tr2, _T("graph/2.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&it1, _T("graph/3.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&it2, _T("graph/4.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&p1, _T("graph/5.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&p2, _T("graph/7.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&p3, _T("graph/6.png"), CELL_SIZE, CELL_SIZE, true);
    loadimage(&p4, _T("graph/8.png"), CELL_SIZE, CELL_SIZE, true);
}

void show_world()
{
    /*put 区*/
    for (int i = 0; i < MAP_SIZE; i++)
    {
        for (int j = 0; j < MAP_SIZE; j++)
        {
            putimage(i * CELL_SIZE, j * CELL_SIZE, &world[i][j].im);
        }
    }
}

// easyx 自带的putimage有点难用
void uimg(int x, int y, IMAGE& z)
{
    putimage(CELL_SIZE * x, CELL_SIZE * y, &z);
}

key task_estimate()
{
    if (GetAsyncKeyState('W'))
    {
        return w;
    }
    else if (GetAsyncKeyState('A'))
    {
        return a;
    }
    else  if (GetAsyncKeyState('S'))
    {
        return s;
    }
    else if (GetAsyncKeyState('D'))
    {
        return d;
    }
    else
    {
        return none_input;//这里才意识到我需要一个标识符，但懒得改了
    }
}
void interact(key l, Player& pl_)
{
    int newX = pl_.p.x;
    int newY = pl_.p.y;

    // 根据按键计算新位置
    switch (l)
    {
    case w:
        newY--; // 上移
        break;
    case a:
        newX--; // 左移
        break;
    case s:
        newY++; // 下移
        break;
    case d:
        newX++; // 右移
        break;
    default:
        return; // 无有效输入，直接返回
    }

    // 边界检查
    if (newX < 0 || newX >= MAP_SIZE || newY < 0 || newY >= MAP_SIZE)
        return; // 超出地图边界，禁止移动

    // 获取目标位置的地图元素
    enu& target = world[newX][newY];
    elem& targetProp = world_[newX][newY];

    // 检查是否可以通行
    if (target.pass_flag == 1)
    {
        // 可以通行，更新玩家位置
        pl_.p.x = newX;
        pl_.p.y = newY;
    }

    // 检查目标位置是否有物品/怪物
    if (targetProp.id > 0)
    {
        position target_p = { newX,newY };
        torch(targetProp.id, pl_, target_p);  //调用物品/怪物交互逻辑，这个你们写
    }

}

void torch(int id, Player p1_, position t)
{
   //提前初始化
    switch (id) {
    case 11:
        
        Monster* mon = &Bu;
        
        battle.Init(&p1_, mon);
        battle.StartBattle();
        if (battle.win) {
            p1_.getitem();
            if (p1_.itemnum == 1) {
                p1_.use_monster[0]->evolution();
                p1.itemnum = -1;
            }
        }
        break;
    case 12:
        
        Monster* mon = &Ch;
        battle.Init(&p1_, mon);
        battle.StartBattle();
        break;
    case 1:
        p1_.getitem();
        if (p1_.itemnum == 1) {
            p1_.use_monster[0]->evolution();
            p1.itemnum = -1;
        }
    }
    //......根据物品/怪物id做出相应行为
    world[t.x][t.y].pass_flag = 1;//吃完道具/打完怪就能通行
    world[t.x][t.y].im = tr;//变回草地
    world_[t.x][t.y].id = 0;//清除物品/怪物
}


void show_player(Player pl, key k)
{
    switch (k)
    {
    case w:
        uimg(pl.p.x, pl.p.y, p1);
        break;
    case a:
        uimg(pl.p.x, pl.p.y, p2);
        break;
    case s:
        uimg(pl.p.x, pl.p.y, p3);
        break;
    case d:
        uimg(pl.p.x, pl.p.y, p4);
        break;
    }
}